package com.zsrt.devbase.common.aspect.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import com.zsrt.devbase.common.utils.ConstantDefine;
import com.zsrt.devbase.common.utils.WebUtil;

/**
 * @author leixin
 * @Email leixin821792669@gmail.com
 * @date 2017年5月18日 上午8:48:57
 * @version 1.0
 */
@Component
@Aspect
@Order(1)
public class ValidAspect {

	private Logger logger = Logger.getLogger(this.getClass());

	/**
	 * 切点为所有控制层并且参数以BingdingResult结尾
	 * 注意：该切面可以进行多个BindingResult的验证，但处理完成的结果中，
	 * 不能包含重复字段，否则重复的错误信息将会被覆盖
	 * @author leixin
	 * @date 2017年5月18日
	 * @param joinPoint
	 * @return
	 * @throws Throwable 
	 */
	@Around("execution(* com.zsrt.devbase.controller.*.*(..)) && args(..,org.springframework.validation.BindingResult)")
	public Object processValidResult(ProceedingJoinPoint joinPoint) throws Throwable {
		logger.info("开始执行验证处理切面");
		Object[] args = joinPoint.getArgs();
		Map<String, Object> result = new HashMap<>();
		Map<String, Object> fieldErrorMap = new HashMap<>();
		for (int i = 0; i < args.length; i++) {
			if (args[i] instanceof BindingResult) {
				getErrorInfo((BindingResult) args[i],fieldErrorMap);
			}
		}
		//如果存在错误信息，就直接返回给前端
		if (null != fieldErrorMap  && !fieldErrorMap.isEmpty()) {
			result.put(ConstantDefine.CHECK_ERROR, fieldErrorMap);
			return WebUtil.getResponseEntity(result);
		}
		return joinPoint.proceed(args);
	}
	
	
	private void getErrorInfo(BindingResult bindingResult,Map<String, Object> fieldErrorMap) {
		if (bindingResult.hasErrors()) {
			List<FieldError> fieldErrors = bindingResult.getFieldErrors();
			for (FieldError fieldError : fieldErrors) {
				fieldErrorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
		}
	}
}
